package com.example.poitest.test1;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.util.ResourceUtils;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;

// Excel复杂模板API导出操作: https://blog.csdn.net/jiangyongbing008/article/details/100795250
public class Test2 {
    public static void main(String[] args) throws FileNotFoundException {
//        ExcelTemplate excel = new ExcelTemplate("F:\\文件\\学生成绩模板.xlsx");
//        ExcelTemplate excel = new ExcelTemplate("E:\\000temp\\shipu2.xlsx");

        String srcFilePath = ResourceUtils.getFile("classpath:export_templates/shipu2.xlsx").getPath();
        String destFilePath = "D:\\000_template_purchaseExport.xls";
//        ClassPathResource classPathResource = new ClassPathResource("/export_templates/shipu2.xlsx");
//        String path = classPathResource.getPath();
        ExcelTemplate excel = new ExcelTemplate(srcFilePath);

        // 使用一个Map来存储所有的行区域，
        // 每个行区域对应Map的一个键
        LinkedHashMap<Integer, LinkedList<String>> rows = new LinkedHashMap<>();
        // 创建第一个行区域里面填充的值，ExcelTemplate会按从左至右，
        // 从上往下的顺序，挨个填充区域里面的${}，所以创建的时候注意顺序就好
        LinkedList<String> row1 = new LinkedList<>();
        row1.add("张三");
        row1.add("90");
        row1.add("87");
        row1.add("76");
        row1.add("82.3");
        row1.add("85");
        // 把第一个行区域row1添加进入rows
        rows.put(1, row1);
        // 创建第二个行区域里面填充的值
        LinkedList<String> row2 = new LinkedList<>();
        row2.add("李四");
        row2.add("70");
        row2.add("66");
        row2.add("87");
        row2.add("92");
        row2.add("81");
        // 把第二个行区域row2添加进入rows
        rows.put(2, row2);
        try {
            // 获取到刚插入的行的数量
            int addRowNum = excel.addRowByExist(0, 2, 2,
                    3, rows, true);
            List<Row> rowList = new ArrayList<>();
            // 获取当前Sheet
            Sheet sheet = excel.getWorkbook().getSheetAt(0);
            // 从插入位置开始循环，获取刚插入的行
            for (int i = 2; i < 2 + addRowNum; i++) {
                rowList.add(sheet.getRow(i));
            }
            // 循环读取刚插入的行
            for (int i = 0; i < rowList.size(); i++) {
                Row row = rowList.get(i);
                if (row == null)
                    continue;
                // 循环行的每个单元格
                for (int j = 0; j <= row.getLastCellNum(); j++) {
                    Cell cell = row.getCell(j);
                    // 单元格必须是公式类型的
                    if (cell == null || cell.getCellType() != CellType.FORMULA)
                        continue;
                    // 获取单元格公式参数的个数
                    // 比如 SUM(B3:F3)，有两个两个参数 B3 F3
                    // 比如 COUNTIF($E2:$AI2,"病")*12+COUNTIF($E2:$AI2,"病4H")*4
                    // 就有四个参数 E2、AI2、E2、AI2 注意，重复的（上述含有两个E2）也算！
                    int formulaVariableNum = excel.getFormulaVariableNum(cell);
                    // 循环操作参数，给参数添加行，添加列等
                    for (int k = 0; k < formulaVariableNum; k++) {
                        // 第一个参数，当前的单元格
                        // 第二个参数，操作的是公式里的第几个参数（比如说是B3，还是F3）
                        // 第三个参数，这个参数的行添加量
                        // 第四个参数，这个参数的列添加量
                        // 如果还是不懂的话，可以查看composeCellFormula方法的注释
                        excel.composeCellFormula(cell, k, i, 0);
                    }
                }
            }
            excel.save("E:\\000temp\\学生成绩统计.xlsx");
//            String srcFilePath1 = ResourceUtils.getFile("classpath:export_templates").getPath();
//            String srcFilePath2 =  srcFilePath1 + "\\学生成绩统计.xlsx";
////            File desc = new File(srcFilePath2);
////            if (!desc.getParentFile().exists()) {
////                desc.getParentFile().mkdirs();
////            }
//            excel.save(srcFilePath2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
